/*
 * @Author: szx
 * @Date: 2022-04-06 15:58:28
 * @LastEditTime: 2022-04-06 16:25:06
 * @Description:
 * @FilePath: \learn\八股文\解析class\class_class.js
 */
class Ninja {
    constructor(name, level = 0) {
        // 这是局部变量，不能被外部所修改（除开闭包）
        let i = 0;
        // 实例属性
        this.name = name;
        this.level = level;
        // 实例方法
        this.sayName = () => {
            console.log(this.name);
        };
        // 给this赋值的，都是实例成员
    }
    // 原型方法（定义在类块中的方法会作为原型方法）
    swingSword() {
        return true;
    }
    /** 
     那么就会有一个问题，实例有属性和方法，那么原型能不能也有属性呢？
     答案是否定的，不能在类块中给原型添加原始值或者对象作为成员数据！
     但在TypeScript中能够实现!!（注意：这里说的是类块里面不能实现！！）
    */
    // 也可以和普通对象一样设置访问器
    set name(newName) {
        this.name = newName;
    }
    get name() {
        return this.name;
    }

    // 静态方法
    static compare(ninja1, ninja2) {
        return ninja1.level - ninja2.level;
    }
    //
}
// 虽然不能在类块内添加成员数据，但在类定义外部手动添加
// 这里应该指的是类似静态属性的东西？
Ninja.greeting = '空你急哇';

// 在原型上定义数据成员
Ninja.prototype.swingSword = 'Yoshi';

// 之所以没有显式支持添加数据成员，是因为在共享目标上（原型和类）上添加可变
// （可修改）数据成员是一种反模式，一般来说，数据成员应该通过this添加到实例上 
